package com.thinkgsp.jxc.persistence;

import java.math.BigDecimal;
import java.sql.Date;
import java.util.List;

import org.apache.ibatis.annotations.Param;

import com.thinkgsp.jxc.model.ProductContact;

/**
 * 产品流水持久化类
 * @author evan
 *
 */
public interface ProductContactMapper {

	/**
	 * 根据Id获取产品流水
	 * @param id
	 * @return
	 */
	public ProductContact getProductContact(Long id);
	
	/**
	 * 根据期间查询产品流水帐
	 * @param begPeriod	开始期间 格式 2013.01 其中整数部分为年份，小数部分为月份
	 * @param endPeriod	截止期间 格式 2013.12 其中整数部分为年份，小数部分为月份
	 * @param invAddId	存货地址Id
	 * @param productId 产品Id
	 * @param batchNoId 批号Id
	 * @return
	 */
	public List<ProductContact> getProductContactListByPeriod(@Param(value="begPeriod") BigDecimal begPeriod,@Param(value="endPeriod") BigDecimal endPeriod,
			@Param(value="invAddId") Integer invAddId,@Param(value="productId") Integer productId,@Param(value="batchNoId") Long batchNoId);
	
	/**
	 * 根据日期查询产品流水帐
	 * @param begDate 开始日期
	 * @param endDate 截止日期
	 * @param invAddId 存货地址Id
	 * @param productId 产品Id
	 * @param batchNoId 批号Id
	 * @return
	 */
	public List<ProductContact> getProductContactListByDate(@Param(value="begDate") Date begDate,@Param(value="endDate") Date endDate,
			@Param(value="invAddId") Integer invAddId,@Param(value="productId") Integer productId,@Param(value="batchNoId") Long batchNoId);
	
	/**
	 * 登记产品存货初始化
	 * @param pc
	 */
	public void recordInit(ProductContact pc);
	
	/**
	 * 删除产品初始化记录
	 * @param pc
	 */
	public void recordUnInit(ProductContact pc);
	
	/**
	 * 登记产品入库
	 * @param pc
	 */
	public void recordIncome(ProductContact pc);
	
	/**
	 * 登记产品反入库
	 * @param pc
	 */
	public void recordUnIncome(ProductContact pc);
	
	/**
	 * 登记产品出库
	 * @param pc
	 */
	public void recordOutcome(ProductContact pc);
	
	/**
	 * 登记产品反出库
	 * @param pc
	 */
	public void recordUnOutcome(ProductContact pc);
	
	/**
	 * 检查单据是否登记乙出入库
	 * @param billId
	 * @return
	 */
	public Boolean hasRecord(Long billId);
	
	/**
	 * 期末结转,本方法必须在存货表结转之后执行
	 * @param curYear 当前年份
	 * @param curPeriod 当前期间
	 * @param nextYear 下一期年份
	 * @param nextPeriod 下一期期间
	 */
	public void periodEndForward(@Param(value="curYear") Integer curYear,@Param(value="curPeriod") Integer curPeriod,@Param(value="nextYear") Integer nextYear,@Param(value="nextPeriod") Integer nextPeriod);
	
	/**
	 * 清空产品往来表
	 */
	public void clearProductContact();

}
